package de.uni_bremen.exceptions.oops;

/**
 * Die Klasse repräsentiert ein Symbol, das von der lexikalischen Analyses erkannt wurde.
 */
class Symbol extends Position
{
	/** Alle definierten Symbole. */
	enum Id
	{
		IDENT, NUMBER, BEGIN, END, CLASS, IS, METHOD, READ, WRITE, IF, THEN, ELSE, ELSEIF, WHILE, DO, COLON, SEMICOLON, COMMA, PERIOD, LPAREN, RPAREN, EQ, NEQ, GT, GTEQ, LT, LTEQ, PLUS, MINUS, TIMES, DIV, MOD, BECOMES, NEW, SELF, NULL, TRUE, FALSE, AND, ANDTHEN, OR, ORELSE, NOT, EXTENDS, BASE, RETURN, PRIVATE, PROTECTED, PUBLIC, EOF
	};
	
	/** Das Symbol. */
	Id		id;
	
	/** Wenn das Symbol NUMBER ist, steht die gelesene Zahl in diesem Attribut. */
	int		number;
	
	/** Wenn das Symbol IDENT ist, steht der gelesene Bezeichner in diesem Attribut. */
	String	ident;
	
	/**
	 * Konstruktor.
	 * 
	 * @param id
	 *            Das erkannte Symbol.
	 * @param position
	 *            Die Quelltextstelle, an der das Symbol erkannt wurde.
	 */
	Symbol(Id id, Position position)
	{
		super(position.line, position.column);
		this.id = id;
	}
	
	/**
	 * Die Methode erzeugt aus diesem Objekt eine darstellbare Zeichenkette.
	 * 
	 * @return Die Zeichenkette.
	 */
	public String toString()
	{
		switch (id)
		{
			case IDENT:
				return "IDENT: " + ident;
			case NUMBER:
				return "NUMBER: " + number;
			default:
				return id.toString();
		}
	}
}
